const moment = require('moment');

module.exports = {
  /**
   * 时间格式化
   * @param {*} fmt YYYY-mm-dd HH:MM:SS
   * @param {*} date 
   */
  dateFormat(fmt, date) {
    let ret;
    let opt = {
      "Y+": date.getFullYear().toString(),        // 年
      "m+": (date.getMonth() + 1).toString(),     // 月
      "d+": date.getDate().toString(),            // 日
      "H+": date.getHours().toString(),                      // 时
      "M+": date.getMinutes().toString(),         // 分
      "S+": date.getSeconds().toString()          // 秒
      // 有其他格式化字符需求可以继续添加，必须转化成字符串
    };
    for (let k in opt) {
      ret = new RegExp("(" + k + ")").exec(fmt);
      if (ret) {
        fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
      };
    };
    return fmt;
  },
  /**
   * 获取当前日期
   * @return YYYY-mm-dd
   */
  getCurrentDate() {
    return this.dateFormat("YYYY-mm-dd", this.getNow());
  },
  /**
   * 获取当前日期时间
   * @return YYYY-mm-dd HH:MM:SS
   */
  getCurrentDateTime() {
    return this.dateFormat("YYYY-mm-dd HH:MM:SS", this.getNow());
  },
  /**
   * 获取两天后的时间
   */
  getTwoAfter() {
    let t = this.getCurrentDateTime()
    let d = this.changeToTimestamp(t)

    let c = d + 172800000
    let formatTime = moment(new Date(c)).format('YYYY-MM-DD HH:mm:ss')
  
    return formatTime
  },
  /**
   * 获取消除时差后的当前时间，返回Date
   */
  getNow() {
    let timestamp = this.getNowTimestamp();
    return new Date(timestamp);
  },
  getNowTimestamp() {
    let timestamp = Date.parse(new Date());
    timestamp = timestamp + 8 * 3600 * 1000;
    return timestamp;
  },
  /**
   * 时间字符串转时间戳
   * @param {*} dateStr 时间字符串（例如 2015-03-05 17:59:00.0） 
   */
  getTimestamp(dateStr) {
    dateStr = dateStr.substring(0, 19);
    dateStr = dateStr.replace(/-/g, '/'); //必须把日期'-'转为'/'
    var timestamp = new Date(dateStr).getTime();
    return timestamp - 8 * 3600 * 1000;
  },
  /**
   * 把时间转成正常的时间戳
   */
  changeToTimestamp(str) {
    let time = new Date(str)
    time.setHours(time.getHours())
    return time.getTime()
  },
  getRandom(min, max) {
    let x = Math.floor(Math.random() * (max - min + 1)) + min;
    return x;
  },
  /**
   * 根据时间字符串获取正常的时间戳,如果什么都不传则就是当前时间
   * @param {*} str 时间字符串
   */
  getTimestampByStr(str) {
    let time = new Date(str)
    return time.getTime() - 28800000
  },
  /**
   * 获取淘宝小程序当前的时间【淘宝小程序的Date对象与node的可能时区设定不一样】
   */
  getReal() {
    let a = new Date()
    a.setHours(a.getHours() + 8)
    const currTimestamp = a.getTime()
    return currTimestamp;
  },
    /**
 * 计算两个日期之间的天数
 * 注意【参数位置是第一个时间早于第二个时间】
 * 改进下参数问题
 * @param dateString1  开始日期 yyyy-MM-dd
 * @param dateString2  结束日期 yyyy-MM-dd
 * @returns {number} 如果日期相同 返回一天 开始日期大于结束日期，返回0
 */
  getDaysBetween(dateString1, dateString2) {
    var startDate = Date.parse(dateString1);
    var endDate = Date.parse(dateString2);
    if (startDate > endDate) {
      return (startDate - endDate) / (1 * 24 * 60 * 60 * 1000);
    }
    if (startDate == endDate) {
      return 1;
    }
    var days = (endDate - startDate) / (1 * 24 * 60 * 60 * 1000);
    return days;
  },
}